//
// Created by denglibin on 19-10-6.
//
/**
 * 内存映射 mapped memory
 * 函数mmap()的使用
 * 函数mmap是linux的一个系统函数。如下：
函数原型：void* mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);

配套函数原型：int munmap(void *addr, size_t length);

头文件：#include <sys/mman.h>

返回值：成功返回创建的映射区的首地址；失败返回宏MAP_FAILED。

 参数介绍：
addr:       建立映射区的首地址，由Linux内核指定。使用时，直接传递NULL。
length：   欲创建映射区的大小。
prot：      映射区权限PROT_READ、PROT_WRITE、PROT_READ|PROT_WRITE。
flags：     标志位参数(常用于设定更新物理区域、设置共享、创建匿名映射区)；
    MAP_SHARED:  会将映射区所做的操作反映到物理设备（磁盘）上。
    MAP_PRIVATE: 映射区所做的修改不会反映到物理设备。
fd：         用来建立映射区的文件描述符。
offset：    映射文件的偏移(4k的整数倍)。
 **/
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <string.h>
static int main_(void){

    // 创建文件
    int fd = open("/home/denglibin/mmap.txt", O_TRUNC | O_CREAT | O_RDWR, 0644);
    ftruncate(fd, 4); // 文件大小改为参数length指定的大小
    __off_t len = lseek(fd, 0, SEEK_END); //文件长度
    char * memp;
    memp = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
    if(memp == MAP_FAILED){
        perror("mmap error:");
        exit(1);
    }
    strcpy(memp, "aaa"); // 直接操作内存(通过操作内存来操作文件)
    int ret = munmap(memp, len); // 释放由mmap创建的这段内存空间
    if(ret == -1){
        perror("munmap error:");
        exit(1);
    }
    close(fd);
    return 0;
}

